#pragma once
#include <map>
using namespace std;

class expression;
class result;

enum functionType {
    NONE = 0,
	POW = 1,	// POW(x, p)
	MOD = 2,	// MOD(x, m)
	SINE = 3,	// sin
	COSINE = 4,	// cos
	TANGENT = 5,	// tan
	COTANGENT = 6,	// cot
	SECANT = 7,		// sec
	COSECANT = 8,	// csc
	ARCSINE = 9,	// arcsin
	ARCCOSINE = 10,	// arccos
	ARCTANGENT = 11,	// arctan
	ARCCOTANGENT = 12,	// arccot
	HYPERBOLIC_SINE = 13,	// sinh
	HYPERBOLIC_COSINE = 14,	// cosh
	HYPERBOLIC_TANGENT = 15,	//tanh
	HYPERBOLIC_COTANGENT = 16,	//coth
	EXP = 17,
	SIGN = 18,	// sign
	ABSOLUTE = 19,	// abs
	FLOOR = 20,	// floor
	CEIL = 21,
	ROUND = 22,
	SQUARE = 23,
	SQUARE_ROOT = 24,
	CUBIC_ROOT = 25,
	RADICAL_ROOT = 26,
	MIN = 27,	// min(a, b)
	MAX = 28,	// max(a, b)
	OPERATOR_BEGIN,
	OPERATOR_PLUS,		// +
	OPERATOR_MINUS,		// -
	OPERATOR_MULTIPLY,	// *
	OPERATOR_DEVIDE,	// /
	OPERATOR_POW,		// ^
	OPERAOTR_END,
};

class mathFunctionDeligate
{
public:
    result evaluate(expression&);
};
